{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 7.1Maximum Margin Classifiers"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "从线性模型二分类问题出发:\n",
    "$$y(x)=w^T(x)\\phi(x)+b$$\n",
    "\n",
    "$$\\begin{cases}\n",
    "t_n=+1,y(x_n)>0\\\\\n",
    "t_n=-1,y(x_n)<0\n",
    "\\end{cases}$$\n",
    "边缘(margin):决策边界与最近的数据点之间的垂直距离\n",
    "\n",
    "在分类的线性模型中，点x到$y(x)=0$定义的超平面的垂直距离是:$\\frac{|y(x)|}{\\lVert x\\lVert}$,对于能够正确分类的数据点有$t_ny(x_n)>0$,点$x_n$到决策面的距离为$\\frac{t_n(w^T\\phi(x_n)+b)}{\\lVert x\\lVert}$\n",
    "\n",
    "最大边缘:$$\\mathop{argmax}_{w,b}\\bigg \\{\\frac{1}{\\lVert w\\lVert}\\mathop{min}_{n}[t_n(w^T\\phi(x_n)+b)]\\bigg\\}$$\n",
    "\n",
    "对于距离决策面最近的点$$t_n(w^T\\phi(x_n)+b)=1$$\n",
    "\n",
    "则所有数据点满足\n",
    "$$t_n(w^T\\phi(x_n)+b)\\ge1$$\n",
    "则最优化问题简化为:\n",
    "$$\\mathop{argmin}_{w,b}\\frac{1}{2}\\lVert{w}\\lVert^2$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "引入Lagrange乘子$a_n\\ge0$:\n",
    "$$L(w,b,a)=\\frac{1}{2}\\lVert{w}\\lVert^2-\\sum^N_{n=1}a_n\\{t_n(w^T\\phi(x_n)+b)-1\\}$$\n",
    "\n",
    "$$w=\\sum_{n=1}^Na_nt_n\\phi(x_n)$$\n",
    "$$0=\\sum^N_{n=1}a_nt_n$$\n",
    "最大边缘化问题的对偶表示:\n",
    "$$\\tilde{L}(a)=\\sum_{n=1}^Na_n-\\frac{1}{2}\\sum_{n=1}^N\\sum_{m=1}^Na_na_mt_nt_mk(x_n,x_m)$$\n",
    "限制条件为:$$a_n\\ge0,n=1,...,N$$\n",
    "$$\\sum^N_{n=1}a_nt_n=0$$\n",
    "\n",
    "消去w,y(x)可由参数${a_N}$和核函数表示:\n",
    "$$y(x)=\\sum_{n=1}^Na_nt_nk(x,x_n)+b$$\n",
    "该最优化问题满足KKT条件:\n",
    "$$\\begin{cases}a_n\\ge0\\\\t_ny(x_n)-1\\ge0\\\\a_n{t_ny(x_n)-1}=0\\end{cases}$$\n",
    "对于每个数据点，要么$a_n=0$要么$t_ny(x_n)=1$,使得$a_n=0$的数据点对于$y(x)$没有贡献，对预测无用，$a_n\\ne0$的点被称为支持向量。⼀旦模型被训练完毕，相当多的数据点都可以被丢弃，只有⽀持向量被保留。\n",
    "\n",
    "\n",
    "因为:\n",
    "$$t_n\\bigg(\\mathop\\sum_{m\\in S}a_mt_mk(x_n,x_m)+b\\bigg)=1$$\n",
    "\n",
    "$$b=\\frac{1}{N_S}\\mathop\\sum_{n\\in S}\\bigg(t_n-\\mathop\\sum_{m\\in S}a_mt_mk(x_n,x_m)\\bigg)$$\n",
    "其中$N_S$为支持向量总数\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[ 0.,  2.],\n",
       "        [ 2.,  0.],\n",
       "        [-1., -1.]],\n",
       "\n",
       "       [[ 0.,  2.],\n",
       "        [ 2.,  0.],\n",
       "        [-1., -1.]],\n",
       "\n",
       "       [[ 0.,  2.],\n",
       "        [ 2.,  0.],\n",
       "        [-1., -1.]]])"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.tile(x_train,(3,1,1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys\n",
    "sys.path.append(r\"../\")\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "from prml.kernel import (\n",
    "    RBF,\n",
    "    PolynomialKernel,\n",
    "    #SupportVectorClassifier,\n",
    "    RelevanceVectorRegressor,\n",
    "    RelevanceVectorClassifier\n",
    ")\n",
    "\n",
    "np.random.seed(1234)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f3638331d68>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#线性核\n",
    "x_train = np.array([\n",
    "        [0., 2.],\n",
    "        [2., 0.],\n",
    "        [-1., -1.]])\n",
    "y_train = np.array([1., 1., -1.])\n",
    "\n",
    "model = SupportVectorClassifier(PolynomialKernel(degree=1))\n",
    "model.fit(x_train, y_train)\n",
    "x0, x1 = np.meshgrid(np.linspace(-3, 3, 100), np.linspace(-3, 3, 100))\n",
    "x = np.array([x0, x1]).reshape(2, -1).T\n",
    "plt.scatter(x_train[:, 0], x_train[:, 1], s=40, c=y_train, marker=\"x\")\n",
    "plt.scatter(model.X[:, 0], model.X[:, 1], s=100, facecolor=\"none\", edgecolor=\"g\")\n",
    "cp = plt.contour(x0, x1, model.distance(x).reshape(100, 100), np.array([-1, 0, 1]), colors=\"k\", linestyles=(\"dashed\", \"solid\", \"dashed\"))\n",
    "plt.clabel(cp, fmt='y=%.f', inline=True, fontsize=15)\n",
    "plt.xlim(-3, 3)\n",
    "plt.ylim(-3, 3)\n",
    "plt.gca().set_aspect(\"equal\", adjustable=\"box\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\np+YpjuAAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f360f208c18>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def create_toy_data():\n",
    "    x = np.random.uniform(-1, 1, 100).reshape(-1, 2)\n",
    "    y = x < 0\n",
    "    y = (y[:, 0] * y[:, 1]).astype(np.float)\n",
    "    return x, 1 - 2 * y\n",
    "#高斯核\n",
    "x_train, y_train = create_toy_data()\n",
    "\n",
    "model = SupportVectorClassifier(RBF(np.ones(3)))\n",
    "model.fit(x_train, y_train)\n",
    "\n",
    "x0, x1 = np.meshgrid(np.linspace(-1, 1, 100), np.linspace(-1, 1, 100))\n",
    "x = np.array([x0, x1]).reshape(2, -1).T\n",
    "plt.scatter(x_train[:, 0], x_train[:, 1], s=40, c=y_train, marker=\"x\")\n",
    "plt.scatter(model.X[:, 0], model.X[:, 1], s=100, facecolor=\"none\", edgecolor=\"g\")\n",
    "plt.contour(\n",
    "    x0, x1, model.distance(x).reshape(100, 100),\n",
    "    np.arange(-1, 2), colors=\"k\", linestyles=(\"dashed\", \"solid\", \"dashed\"))\n",
    "plt.xlim(-1, 1)\n",
    "plt.ylim(-1, 1)\n",
    "plt.gca().set_aspect(\"equal\", adjustable=\"box\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
